home *** CD-ROM | disk | FTP | other *** search
- /*** MODEM_IO.C ***/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include "pcl4c.h"
- #include "ascii.h"
- #include "modem_io.h"
- #include "term_io.h"
-
- #define FALSE 0
- #define TRUE !FALSE
- #define ONE_SECOND 18
-
- /* NOTE: Requires AT COMMAND SET for all functions in this file */
-
- static int LastPort; /* last port referenced */
-
- /*** PRIVATE functions ***/
-
- static int BreakTest(void)
- {/* User BREAK ? */
- if(SioBrkKey()||SioKeyPress())
- {printf("User BREAK\n");
- return(TRUE);
- }
- return(FALSE);
- }
-
- /*** PUBLIC functions ***/
-
- /* echos incoming to screen */
-
- void ModemEcho(int Port,int Echo)
- {int rc;
- long Time;
- Time = SioTimer();
- while(SioTimer() < Time+(long)Echo)
- {rc = CharGet(Port,1);
- if(rc>=0) printf("%c",(char)rc);
- }
- }
-
- /* send string to modem & get echo */
-
- int ModemSendTo(
- int Port, /* port to talk to */
- int Pace, /* inter-char delay */
- char *String) /* string to send to modem */
- {int i, rc;
- char c;
- int Code;
- long Time;
- for(i=0;i<strlen(String);)
- {/* User BREAK ? */
- if(BreakTest()) return(FALSE);
- /* delay <Pace> tics */
- if(Pace>0) ModemEcho(Port,Pace);
- /* fetch character */
- c = String[i++];
- switch(c)
- {case '^':
- /* next char is control char */
- c = String[i++] - '@';
- break;
- case '!':
- /* replace ! with carriage return */
- c = CR;
- break;
- case '~':
- /* delay 1/2 second */
- SioDelay(ONE_SECOND/2);
- c = ' ';
- break;
- case ' ':
- /* delay 1/4 second */
- SioDelay(ONE_SECOND/4);
- c = ' ';
- break;
- } /* end switch */
- /* transmit as 7 bit ASCII character */
- CharPut(Port,(char)(0x7f & c));
- }
- return(TRUE);
- } /* end SendTo */
-
- /* wait for 'String' */
-
- /* NOTES:
- ** (1) Be sure to call ModemSendTo with Echo=0 if you will then
- ** call ModemWaitFor() to check for the response
- */
-
- int ModemWaitFor(
- int Port, /* Port to talk to */
- int Tics, /* wait in tics for string */
- int CaseFlag, /* TRUE = case sensitive compares */
- char *String) /* string to wait for */
- {int i, k;
- char c1, c2;
- int Code;
- char *Ptr;
- long Time;
- /* wait for string */
- Time = SioTimer();
- Ptr = String;
- while(SioTimer()<(Time+(long)Tics))
- {/* User BREAK ? */
- if(BreakTest()) return(FALSE);
- /* wait for next character */
- Code = CharGet(Port,1);
- if(Code<-1) return(FALSE);
- if(Code>=0)
- {/* echo char */
- printf("%c",(char)Code);
- /* prepare chars */
- c1 = *Ptr++;
- c2 = (char)Code;
- /* case sensitive ? */
- if(!CaseFlag)
- {c1 = toupper(c1);
- c2 = toupper(c2);
- }
- /* does char match ? */
- if(c1==c2)
- {if(*Ptr=='\0') return TRUE;
- }
- else Ptr = String;
- }
- } /* end for(i) */
- return FALSE;
- }
-
- /* enter command state */
-
- /* NOTE: assumes escape char = '+' & guard time = 1 sec */
-
- void ModemCmdState(int Port)
- {int i;
- /* delay a bit over 1 second */
- SioDelay(ONE_SECOND+ONE_SECOND/4);
- /* send Escape Code exactly 3 times */
- for(i=0;i<3;i++)
- {CharPut(Port,'+');
- SioDelay(ONE_SECOND/4);
- }
- /* delay again */
- SioDelay(ONE_SECOND+ONE_SECOND/4);
- } /* end ModemCmdState */
-
- /* hangup phone (in command state) */
-
- void ModemHangup(int Port)
- {/* enter command state */
- ModemCmdState(Port);
- /* hangup ! */
- ModemSendTo(Port,4,"!AT!");
- ModemEcho(Port,10);
- ModemSendTo(Port,4,"ATH0!");
- } /* end Hangup */
-
- /* wait for continuous quiet (no incoming serial data) */
-
- int ModemQuiet(
- int Port, /* Port to talk to */
- int Tics) /* # tics quiet required */
- {int i;
- int Code;
- long CharTime;
- /* set up */
- CharTime = SioTimer();
- while(1)
- {/* User BREAK ? */
- if(BreakTest())
- {
- return(FALSE);
- }
- /* wait for next character */
- Code = CharGet(Port,1);
- if(Code<-1) return(FALSE);
- if(Code>=0)
- {CharTime = SioTimer();
- printf("%c",(char)Code);
- }
- else
- {/* ==-1, timed out */
- if(SioTimer() >= CharTime+(long)Tics) return TRUE;
- }
- } /* end while */
- }